/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.proyecto.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.proyecto.bean.Proyecto;
import sv.com.intesal.proyecto.bean.ProyectoResumenGeneral;
import sv.com.intesal.proyecto.sql.SQLProyecto;
import sv.com.intesal.proyecto.sql.SQLProyecto_ResumenGeneral;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author JM
 */
public class ProyectoControlador {

    public List<Proyecto> getProyectos_Pendientes() throws Exception {

        List<Proyecto> list = new ArrayList<Proyecto>();
        ResultSet rs = null;
        try {
            rs = cConexion.conectar().prepareStatement(SQLProyecto.superFindAllProyectoPendientes).executeQuery();
            while (rs.next()) {
                Proyecto p = new Proyecto();

                /*PROYECTO*/
                p.setId_p(rs.getInt("id_p"));
                p.setNombre_p(rs.getString("nombre_p"));
                p.setDireccion_p(rs.getString("direccion_p"));
                p.setEstado_p(rs.getString("estado_p"));
                p.setFecha_inicio_p(rs.getDate("fecha_inicio_p"));
                p.setFecha_final_p(rs.getDate("fecha_finalizacion_p"));
                p.setDescripcion_p(rs.getString("descripcion_p"));

                /*CLIENTE*/
                p.setId_c(rs.getInt("id_c"));
                p.setCodigo_cl(rs.getInt("id_c"));
                p.setEmpresa_c(rs.getString("empresa_c"));
                p.setRegistro_c(rs.getString("registro_c"));
                p.setDireccion_c(rs.getString("direccion_c"));
                p.setNit_c(rs.getString("nit_c"));
                p.setContacto_c(rs.getString("contacto_c"));
                p.setEmail_c(rs.getString("email_c"));
                p.setGiro_c(rs.getString("giro_c"));
                p.setOtra_informacion_c(rs.getString("otra_informacion_c"));

                /*TIPO_PROYECTO*/
                p.setId_tp(rs.getInt("id_tp"));
                p.setNombre_tp(rs.getString("nombre_tp"));

                /*PAIS*/
                p.setId_pais(rs.getInt("id_pais"));
                p.setNombre_pais(rs.getString("nombrePais"));

                /*DEPARTAMENTO*/
                p.setId_d(rs.getInt("id_d"));
                p.setNombre_d(rs.getString("nombre_d"));

                /*MUNICIPIO*/
                p.setId_mu(rs.getInt("id_mu"));
                p.setNombre_mu(rs.getString("nombre_mu"));

                /*TIPO_CLIENTE*/
                p.setId_tc(rs.getInt("id_tc"));
                p.setNombre_tc(rs.getString("nombre_tc"));

                /*USUARIO*/
                p.setId_u(rs.getInt("id_u"));
                p.setEstado_nombre_p(this.getEstadoNombre(rs.getString("estado_p")));

                list.add(p);
            }
            return list;
        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    public List<Proyecto> getProyectos(String estado) throws Exception {
        List<Proyecto> list = new ArrayList<Proyecto>();
        try {

            String sql = SQLProyecto.superFindAllProyectos; //without order by and without estado
            String order_by = " order by tp.nombre_tp,p.nombre_p,cl.empresa_c,p.descripcion_p";
            if (estado.length() >= 3) {
                estado = " and p.estado_p in ('" + estado + "') ";
            } else if (estado != "") {
                estado = " and p.estado_p='" + estado + "' ";
            }
            sql = sql + estado + order_by;

            ResultSet rs = cConexion.conectar().prepareStatement(sql).executeQuery();
            while (rs.next()) {
                Proyecto p = new Proyecto();

                /*PROYECTO*/
                p.setId_p(rs.getInt("id_p"));
                p.setNombre_p(rs.getString("nombre_p"));
                p.setDireccion_p(rs.getString("direccion_p"));
                p.setEstado_p(rs.getString("estado_p"));
                p.setFecha_inicio_p(rs.getDate("fecha_inicio_p"));
                p.setFecha_final_p(rs.getDate("fecha_finalizacion_p"));
                p.setDescripcion_p(rs.getString("descripcion_p"));

                /*CLIENTE*/
                p.setId_c(rs.getInt("id_c"));
                p.setCodigo_cl(rs.getInt("id_c"));
                p.setEmpresa_c(rs.getString("empresa_c"));
                p.setRegistro_c(rs.getString("registro_c"));
                p.setDireccion_c(rs.getString("direccion_c"));
                p.setNit_c(rs.getString("nit_c"));
                p.setContacto_c(rs.getString("contacto_c"));
                p.setEmail_c(rs.getString("email_c"));
                p.setGiro_c(rs.getString("giro_c"));
                p.setOtra_informacion_c(rs.getString("otra_informacion_c"));

                /*TIPO_PROYECTO*/
                p.setId_tp(rs.getInt("id_tp"));
                p.setNombre_tp(rs.getString("nombre_tp"));

                /*PAIS*/
                p.setId_pais(rs.getInt("id_pais"));
                p.setNombre_pais(rs.getString("nombrePais"));

                /*DEPARTAMENTO*/
                p.setId_d(rs.getInt("id_d"));
                p.setNombre_d(rs.getString("nombre_d"));

                /*MUNICIPIO*/
                p.setId_mu(rs.getInt("id_mu"));
                p.setNombre_mu(rs.getString("nombre_mu"));

                /*TIPO_CLIENTE*/
                p.setId_tc(rs.getInt("id_tc"));
                p.setNombre_tc(rs.getString("nombre_tc"));

                /*USUARIO*/
                p.setId_u(rs.getInt("id_u"));
                p.setEstado_nombre_p(this.getEstadoNombre(rs.getString("estado_p")));

                list.add(p);
            }
            return list;
        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    public List<Proyecto> getProyectos_Pendientes(Proyecto pr) throws Exception {

        List<Proyecto> list = new ArrayList<Proyecto>();
        ResultSet rs = null;
        PreparedStatement ps = null;
        Connection cnn = null;

        try {
            String filtro_cliente = " ";
            String filtro_fechas = " ";

            if (pr.getCodigo_cl() != null) {
                filtro_cliente = " and cl.id_c=" + pr.getCodigo_cl() + " ";
            }

            String sql = "SELECT p.id_p,p.nombre_p,p.direccion_p,p.estado_p,p.fecha_inicio_p,p.fecha_finalizacion_p,p.fechahora,p.descripcion_p,p.id_u, tp.id_tp,tp.nombre_tp,tc.id_tc,tc.nombre_tc,s.codigo_s,s.nombre_s,pa.id_p as id_pais,pa.nombre_p as nombrePais,mu.id_mu,mu.nombre_mu,d.id_d,d.nombre_d,cl.id_c,cl.empresa_c,cl.contacto_c,cl.email_c,cl.giro_c,cl.nit_c,cl.direccion_c,cl.registro_c,cl.otra_informacion_c,cl.telefono_c,cl.plazo_c,cl.limite_credito_c,cl.aplicar_retencion_c FROM PROYECTO AS p,SUCURSAL AS s,TIPO_PROYECTO AS tp,CLIENTE AS cl,TIPO_CLIENTE AS tc,MUNICIPIO AS mu,DEPARTAMENTO AS d,PAIS AS pa where pa.id_p=d.id_p and d.id_d=mu.id_d and mu.id_mu=cl.id_mu and tc.id_tc=cl.id_tc and cl.id_c=p.id_c and s.codigo_s=p.codigo_s and tp.id_tp=p.id_tp " + filtro_cliente + " ";

            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(sql);

            rs = ps.executeQuery();
            while (rs.next()) {
                Proyecto p = new Proyecto();

                /*PROYECTO*/
                p.setId_p(rs.getInt("id_p"));
                p.setNombre_p(rs.getString("nombre_p"));
                p.setDireccion_p(rs.getString("direccion_p"));
                p.setEstado_p(rs.getString("estado_p"));
                p.setFecha_inicio_p(rs.getDate("fecha_inicio_p"));
                p.setFecha_final_p(rs.getDate("fecha_finalizacion_p"));
                p.setDescripcion_p(rs.getString("descripcion_p"));

                /*CLIENTE*/
                p.setId_c(rs.getInt("id_c"));
                p.setCodigo_cl(rs.getInt("id_c"));
                p.setEmpresa_c(rs.getString("empresa_c"));
                p.setRegistro_c(rs.getString("registro_c"));
                p.setDireccion_c(rs.getString("direccion_c"));
                p.setNit_c(rs.getString("nit_c"));
                p.setContacto_c(rs.getString("contacto_c"));
                p.setEmail_c(rs.getString("email_c"));
                p.setGiro_c(rs.getString("giro_c"));
                p.setOtra_informacion_c(rs.getString("otra_informacion_c"));

                /*TIPO_PROYECTO*/
                p.setId_tp(rs.getInt("id_tp"));
                p.setNombre_tp(rs.getString("nombre_tp"));

                /*PAIS*/
                p.setId_pais(rs.getInt("id_pais"));
                p.setNombre_pais(rs.getString("nombrePais"));

                /*DEPARTAMENTO*/
                p.setId_d(rs.getInt("id_d"));
                p.setNombre_d(rs.getString("nombre_d"));

                /*MUNICIPIO*/
                p.setId_mu(rs.getInt("id_mu"));
                p.setNombre_mu(rs.getString("nombre_mu"));

                /*TIPO_CLIENTE*/
                p.setId_tc(rs.getInt("id_tc"));
                p.setNombre_tc(rs.getString("nombre_tc"));

                /*USUARIO*/
                p.setId_u(rs.getInt("id_u"));
                p.setEstado_nombre_p(this.getEstadoNombre(rs.getString("estado_p")));

                list.add(p);
            }
            return list;
        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }


    public List<Proyecto> getLista_Proyectos() {
        List<Proyecto> list = new ArrayList<Proyecto>();
        ResultSet rs = null;
        try {
            rs = cConexion.conectar().prepareStatement(SQLProyecto.ListaProyecto).executeQuery();
            while (rs.next()) {
                Proyecto p = new Proyecto();
                //Lista de Proyectos
                p.setNombre_tp(rs.getString("nombre_tp"));
                p.setId_p(rs.getInt("id_p"));
                p.setNombre_p(rs.getString("nombre_p"));
                p.setDireccion_p(rs.getString("direccion_p"));
                p.setDescripcion_p(rs.getString("descripcion_p"));
                p.setEstado_p(rs.getString("estado_p"));
                p.setFecha_inicio_p(rs.getDate("fecha_inicio_p"));
                p.setFecha_final_p(rs.getDate("fecha_finalizacion_p"));
                p.setId_tp(rs.getInt("id_tp"));
                p.setEstado_nombre_p(this.getEstadoNombre(rs.getString("estado_p")));
                list.add(p);

            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }


    private String getEstadoNombre(String estado) throws Exception {
        try {
            if (estado.equals("P")) {
                return "Pendiente Aprobar";
            } else if (estado.equals("AP")) {
                return "Aprobado";
            } else if (estado.equals("AC")) {
                return "Activo";
            } else if (estado.equals("D")) {
                return "Denegado";
            } else if (estado.equals("F")) {
                return "Finalizado Aprobar";
            }
            return "Desconocido";
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setEnca(Proyecto pr, List<Proyecto> lista) throws Exception {

        Connection cnn = null;
        try {
            cnn = cConexion.conectar();
            PreparedStatement ps;
            SessionControlador sc = new SessionControlador();

            if (pr.getId_p() == null) {
                ps = cnn.prepareStatement(SQLProyecto.insertProyecto);
            } else {
                ps = cnn.prepareStatement(SQLProyecto.modificarProyecto);
                ps.setInt(11, pr.getId_p());
            }
            ps.setInt(1, pr.getCodigo_cl());
            ps.setInt(2, pr.getId_tp());
            ps.setInt(3, sc.getCodigo_Sucursal());//codigo_s
            ps.setInt(4, sc.getCodigo_Usuario());
            ps.setString(5, pr.getNombre_p());
            ps.setString(6, pr.getDescripcion_p());
            ps.setString(7, pr.getDireccion_p());

            ps.setString(8, "P"); //estado_p
            ps.setDate(9, cVarios.getFecha(pr.getFecha_inicio_p()));
            ps.setDate(10,cVarios.getFecha(pr.getFecha_final_p()));
            ps.executeUpdate();

            this.setDeta(pr, lista);
            cnn.close();
            ps.close();

            Mensaje m = new Mensaje();
            if (pr.getId_p() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void setDeta(Proyecto pr, List<Proyecto> lista) throws Exception {

        try {
            Integer codigo_p = pr.getId_p();
            if (codigo_p == null) {
                codigo_p = this.getMax();
            }

            for (int i = 0; i < lista.size(); i++) {
                if (lista.get(i).getCodigo_d() == 0) { //SI SOLO ES UN NUEVO REGISTRO
                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLProyecto.insertDetaProyecto);

                    ps.setInt(1, lista.get(i).getId_dm());
                    ps.setInt(2, codigo_p);
                    ps.setDouble(3, lista.get(i).getCantidad_d());
                    ps.executeUpdate();
                    ps.close();
                    cnn.close();
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setEstado(String estado, Integer codigo_pr) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLProyecto.setCambiarEstado);
            ps.setString(1, estado);
            ps.setInt(2, codigo_pr);
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void eliminarItemDetaProyecto(Proyecto pr) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLProyecto.eliminarItemDetaProyecto);
            ps.setInt(1, pr.getCodigo_d());
            ps.executeUpdate();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private Integer getMax() throws Exception {
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLProyecto.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Proyecto getProyecto(Integer codigo_p) throws Exception {

        Connection cnn = null;

        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLProyecto.superFindProyecto_x_Codigo);
            ps.setInt(1, codigo_p);
            rs = ps.executeQuery();

            Proyecto p = new Proyecto();
            while (rs.next()) {

                /*PROYECTO*/
                p.setId_p(rs.getInt("id_p"));
                p.setNombre_p(rs.getString("nombre_p"));
                p.setDireccion_p(rs.getString("direccion_p"));
                p.setEstado_p(rs.getString("estado_p"));
                p.setFecha_inicio_p(rs.getDate("fecha_inicio_p"));
                p.setFecha_final_p(rs.getDate("fecha_finalizacion_p"));
                p.setDescripcion_p(rs.getString("descripcion_p"));

                /*CLIENTE*/
                p.setId_c(rs.getInt("id_c"));
                p.setCodigo_cl(rs.getInt("id_c"));
                p.setEmpresa_c(rs.getString("empresa_c"));
                p.setRegistro_c(rs.getString("registro_c"));
                p.setDireccion_c(rs.getString("direccion_c"));
                p.setNit_c(rs.getString("nit_c"));
                p.setContacto_c(rs.getString("contacto_c"));
                p.setEmail_c(rs.getString("email_c"));
                p.setGiro_c(rs.getString("giro_c"));
                p.setOtra_informacion_c(rs.getString("otra_informacion_c"));

                /*TIPO_PROYECTO*/
                p.setId_tp(rs.getInt("id_tp"));
                p.setNombre_tp(rs.getString("nombre_tp"));

                /*PAIS*/
                p.setId_pais(rs.getInt("id_pais"));
                p.setNombre_pais(rs.getString("nombrePais"));

                /*DEPARTAMENTO*/
                p.setId_d(rs.getInt("id_d"));
                p.setNombre_d(rs.getString("nombre_d"));

                /*MUNICIPIO*/
                p.setId_mu(rs.getInt("id_mu"));
                p.setNombre_mu(rs.getString("nombre_mu"));

                /*TIPO_CLIENTE*/
                p.setId_tc(rs.getInt("id_tc"));
                p.setNombre_tc(rs.getString("nombre_tc"));

                /*USUARIO*/
                p.setId_u(rs.getInt("id_u"));
                p.setEstado_nombre_p(this.getEstadoNombre(rs.getString("estado_p")));
            }
            rs.close();
            ps.close();
            cnn.close();

            return p;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }


    public List<Proyecto> getDetaMateriales_x_Proyecto(Integer codigo_pr) throws Exception {

        List<Proyecto> lista = new ArrayList<Proyecto>();
        try {

            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLProyecto.ListaProyecto);
            ps.setInt(1, codigo_pr);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Proyecto pr = new Proyecto();
                pr.setCantidad_d(rs.getDouble("cantidad_d"));/*DETA_PROYECTO*/
                pr.setCodigo_d(rs.getInt("id_d"));
                pr.setNombre_m(rs.getString("nombre_m"));/*MATERIAL*/
                pr.setId_dm(rs.getInt("id_dm"));/*MATERIAL_SUCURSAL*/
                lista.add(pr);
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Proyecto> getDetaMateriales_x_Proyecto(Proyecto p) throws Exception {
        List<Proyecto> lista = new ArrayList<Proyecto>();
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLProyecto.getDetaProyecto_x_Proyecto);
            ps.setInt(1, p.getId_p());
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Proyecto pr = new Proyecto();
                pr.setNombre_m(rs.getString("nombre_m"));
                pr.setId_dm(rs.getInt("id_dm"));
                pr.setId_m(rs.getInt("id_m"));
                pr.setCodigo_d(rs.getInt("id_d"));
                pr.setCantidad_d(rs.getDouble("cantidad_d"));
                pr.setId_p(rs.getInt("id_p"));
                lista.add(pr);
            }

            ps.close();
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validar_estado_accion_anular_modificar(Integer id_p) throws Exception {
        //Valida si tiene permisos para modificar o anular DP,SP o UP
        //Solamente si tiene estado AP=aprobado puede realizar accion
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLProyecto.getEstado);
            ps.setInt(1, id_p);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                if (rs.getString("estado_oc").equals("AP")) {
                    return true;
                }
            }
            return false;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /*REPORTES*/
    public void generarReporte_ConsultaMaestraProyecto(Proyecto p) throws Exception {
        try {
            String var_proyecto = " and p.id_p=" + p.getId_p() + " ";
            String sql =
                    " SELECT 'DP' as tipo,d.id_d,s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,dp.fecha_dp as fecha,dp.fechahora as fechahora,dp.observacion_dp as observacion, dp.bloque_dp as bloque,dp.numero_documento_dp as numero_documento, m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp,pa.nombre_p as nombrePais,de.nombre_d,mu.nombre_mu FROM CLIENTE as cl, PROYECTO as p,DEVOLUCION_PROYECTO as dp,DETA_DEVOLUCION_PROYECTO as d,EMPLEADO as e,MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s,PAIS as pa,DEPARTAMENTO as de,MUNICIPIO as mu where cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and m.id_m=ms.id_m and ms.id_dm=d.id_dm and s.codigo_s=ms.codigo_s and pa.id_p=de.id_p and de.id_d=mu.id_d and mu.id_mu=cl.id_mu and p.id_p=dp.id_p and dp.id_dp=d.id_dp and e.id_e=dp.id_e"
                    + var_proyecto + " UNION "
                    + " SELECT 'SP' as tipo,d.id_d,s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,sp.fecha_sp as fecha,sp.fechahora as fechahora,sp.observacion_sp as observacion, sp.bloque_sp as bloque,sp.numero_documento_sp as numero_documento, m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp,pa.nombre_p as nombrePais,de.nombre_d,mu.nombre_mu FROM CLIENTE as cl, PROYECTO as p,SALIDA_PROYECTO as sp,DETA_SALIDA_PROYECTO as d,EMPLEADO as e,MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s,PAIS as pa,DEPARTAMENTO as de,MUNICIPIO as mu where cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and m.id_m=ms.id_m and ms.id_dm=d.id_dm and s.codigo_s=ms.codigo_s and pa.id_p=de.id_p and de.id_d=mu.id_d and mu.id_mu=cl.id_mu and p.id_p=sp.id_p and sp.id_sp=d.id_sp and e.id_e=sp.id_e "
                    + var_proyecto + " UNION "
                    + " SELECT 'UP' as tipo,d.id_d,s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,up.fecha_up as fecha,up.fechahora as fechahora,up.observacion_up as observacion, up.bloque_up as bloque,up.numero_documento_up as numero_documento, m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp,pa.nombre_p as nombrePais,de.nombre_d,mu.nombre_mu FROM CLIENTE as cl, PROYECTO as p,UTILIZACION_PROYECTO as up,DETA_UTILIZACION_PROYECTO as d,EMPLEADO as e, MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s,PAIS as pa,DEPARTAMENTO as de,MUNICIPIO as mu where cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and m.id_m=ms.id_m and ms.id_dm=d.id_dm and s.codigo_s=ms.codigo_s and pa.id_p=de.id_p and de.id_d=mu.id_d and mu.id_mu=cl.id_mu and p.id_p=up.id_p and up.id_up=d.id_up and e.id_e=up.id_e "
                    + var_proyecto + " order by tipo,fecha,fechahora,numero_documento ";
            System.out.println(sql);
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_ConsultaMaestraProyecto_x_Cliente(Proyecto p) throws Exception {
        try {
            String var_cliente = " ";

            if (p.getId_c() != null) {
                var_cliente = " and cl.id_c=" + p.getId_c() + " ";
            }
            String sql =
                    " SELECT 'DP' as tipo,d.id_d,s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,dp.fecha_dp as fecha,dp.fechahora as fechahora,dp.observacion_dp as observacion, dp.bloque_dp as bloque,dp.numero_documento_dp as numero_documento, m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp,pa.nombre_p as nombrePais,de.nombre_d,mu.nombre_mu FROM CLIENTE as cl, PROYECTO as p,DEVOLUCION_PROYECTO as dp,DETA_DEVOLUCION_PROYECTO as d,EMPLEADO as e,MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s,PAIS as pa,DEPARTAMENTO as de,MUNICIPIO as mu where cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and m.id_m=ms.id_m and ms.id_dm=d.id_dm and s.codigo_s=ms.codigo_s and pa.id_p=de.id_p and de.id_d=mu.id_d and mu.id_mu=cl.id_mu and p.id_p=dp.id_p and dp.id_dp=d.id_dp and e.id_e=dp.id_e"
                    + var_cliente + " UNION "
                    + " SELECT 'SP' as tipo,d.id_d,s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,sp.fecha_sp as fecha,sp.fechahora as fechahora,sp.observacion_sp as observacion, sp.bloque_sp as bloque,sp.numero_documento_sp as numero_documento, m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp,pa.nombre_p as nombrePais,de.nombre_d,mu.nombre_mu FROM CLIENTE as cl, PROYECTO as p,SALIDA_PROYECTO as sp,DETA_SALIDA_PROYECTO as d,EMPLEADO as e,MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s,PAIS as pa,DEPARTAMENTO as de,MUNICIPIO as mu where cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and m.id_m=ms.id_m and ms.id_dm=d.id_dm and s.codigo_s=ms.codigo_s and pa.id_p=de.id_p and de.id_d=mu.id_d and mu.id_mu=cl.id_mu and p.id_p=sp.id_p and sp.id_sp=d.id_sp and e.id_e=sp.id_e "
                    + var_cliente + " UNION "
                    + " SELECT 'UP' as tipo,d.id_d,s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p, p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,up.fecha_up as fecha,up.fechahora as fechahora,up.observacion_up as observacion, up.bloque_up as bloque,up.numero_documento_up as numero_documento, m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre ,tc.nombre_tc,tp.nombre_tp,pa.nombre_p as nombrePais,de.nombre_d,mu.nombre_mu FROM CLIENTE as cl, PROYECTO as p,UTILIZACION_PROYECTO as up,DETA_UTILIZACION_PROYECTO as d,EMPLEADO as e, MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s,PAIS as pa,DEPARTAMENTO as de,MUNICIPIO as mu where cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and m.id_m=ms.id_m and ms.id_dm=d.id_dm and s.codigo_s=ms.codigo_s and pa.id_p=de.id_p and de.id_d=mu.id_d and mu.id_mu=cl.id_mu and p.id_p=up.id_p and up.id_up=d.id_up and e.id_e=up.id_e "
                    + var_cliente + " order by tipo,fecha,fechahora,numero_documento ";
            System.out.println(sql);
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /*
     * Reporte General de Totales por Proyecto.
     * Reporte de Gerencia
     */
    public List<ProyectoResumenGeneral> getResumenTotal(Proyecto pr) throws Exception {
        List<ProyectoResumenGeneral> lista = new ArrayList<ProyectoResumenGeneral>();

        PreparedStatement ps = null;
        Connection cnn = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLProyecto_ResumenGeneral.getResumenTotal);
            ps.setInt(1, pr.getId_p());
            ps.setInt(2, pr.getId_p());
            ps.setInt(3, pr.getId_p());
            ps.setInt(4, pr.getId_p());
            ps.setInt(5, pr.getId_p());
            ps.setInt(6, pr.getId_p());
            ps.setInt(7, pr.getId_p());
            ps.setInt(8, pr.getId_p());
            ps.setInt(9, pr.getId_p());
            ps.setInt(10, pr.getId_p());
            ps.setInt(11, pr.getId_p());
            ps.setInt(12, pr.getId_p());
            ps.setInt(13, pr.getId_p());
            ps.setInt(14, pr.getId_tp());

            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                ProyectoResumenGeneral rg = new ProyectoResumenGeneral();

                /*PROYECTO*/
                rg.setDescripcion_p(rs.getString("descripcion_p"));
                rg.setDireccion_p(rs.getString("direccion_p"));
                rg.setFecha_finazalicion_p(rs.getDate("fecha_finalizacion_p"));
                rg.setFecha_inicio_p(rs.getDate("fecha_inicio_p"));

                /*CATEGORIA*/
                rg.setNombre_cat(rs.getString("nombre_cat"));

                /*SUB CATEGORIA*/
                rg.setNombre_su(rs.getString("nombre_su"));

                /*TIPO MATERIAL*/
                rg.setNombre_tm(rs.getString("nombre_tm"));

                /*MATERIAL*/
                rg.setNombre_m(rs.getString("nombre_m"));

                /*TOTALES*/
                rg.setTotal(rs.getDouble("total"));
                rg.setTotal_devolucion(rs.getDouble("total_devolucion"));
                rg.setTotal_salida(rs.getDouble("total_salida"));
                rg.setTotal_utilizacion(rs.getDouble("total_utilizacion"));
                rg.setTotal_presupuesto(rs.getDouble("total_presupuesto"));

                lista.add(rg);
            }

            ps.close();
            rs.close();
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}